package com.qksnap.www.snap.gui.tabpane.componet;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.ByteBuffer;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.Border;
import com.qksnap.www.snap.gui.SplashScreen;
import com.qksnap.www.snap.gui.tabpane.Links;
import com.qksnap.www.snap.gui.tabpane.data.ImageLink;
import com.qksnap.www.snap.util.Config;
public class ScreenShotImage extends JButton {
/** Paint our Btn **/
private Painter painter;
private ImageLink link;
/** our background **/
private SoftReference<BufferedImage> image;
/** Are we Selected? **/
private boolean selected = false;
/** id **/
private int id = -1;
public static volatile long start;
public static int totalSelected = 0;
private boolean needUpdate = false;
public BufferedImage getBufferedImage() {
if (image != null && !needUpdate){
final BufferedImage cachedImg = image.get();
if (cachedImg != null) {
return cachedImg;
}
}
System.out.println("Updating cache.");
try {
if(id < 0)
image = new SoftReference<BufferedImage>(ImageIO.read(new ByteArrayInputStream(Config.getAsByteArray(Links.class.getResource("/noimage.png")))));
else
image = new SoftReference<BufferedImage>(ImageIO.read(new ByteArrayInputStream(Config.scaleImage(Config.getUrlImageAsByteArray("http://www.qksnap.com/imgs/"+getLink().getName()), 161,106))));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
needUpdate = false;
return image.get();
}
/**
* Create a screenshot image
* @throws IOException
*/
public MouseListener getMouseListener() {
return new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if(getLink() == null)
return;
switch(e.getButton()) {
case MouseEvent.BUTTON1:
if( !java.awt.Desktop.isDesktopSupported() ) {
JOptionPane.showMessageDialog(null,"You computer does not support AWT Desktop :(","Desktop is not supported!", 2);
}
java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
if( !desktop.isSupported( java.awt.Desktop.Action.BROWSE ) ) {
JOptionPane.showMessageDialog(null,"You computer does not support AWT Desktop Browsing :(","Desktop Browse is not supported!", 2);
}
try {
desktop.browse( new URI(getLink().getLink()));
}
catch ( Exception ed ) {
}
//JOptionPane.showMessageDialog(null, "", getLink().getLink(), JOptionPane.INFORMATION_MESSAGE, new ImageIcon(getFileLocation()));
break;
case MouseEvent.BUTTON3:
selected = !selected;
changeUpload(selected);
break;
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
};
}
public ScreenShotImage(int id,ImageLink img) throws IOException{
this.setBorder(BorderFactory.createMatteBorder(
2, 2, 2, 2, Color.white));
this.id = id;
setLink(img);
final String html =
"<html><body>" +
"<p><b>To View Image</b>: Left Click Image<br>" +
"<b>To Select from export</b>: Right Click Image<br>"+
"<b>URL Link</b>: " + getLink().getLink() +"<br>"+
"<b>Upload Date</b>: "+ getLink().getDate()+"<br>"+
"<b>Size</b>: "+ getLink().getSize()+"</p>";
setToolTipText(html);
addMouseListener(getMouseListener());
setupImageElements();
setVisible(true);
needUpdate = true;
}
public ScreenShotImage(int id) throws IOException{
this.setBorder(BorderFactory.createMatteBorder(
2, 2, 2, 2, Color.white));
this.id = id;
addMouseListener(getMouseListener());
setupImageElements();
setVisible(true);
needUpdate = true;
}
public void changeUpload(boolean in){
if(in){
ScreenShotImage.totalSelected++;
SplashScreen.getSingleton().getMainFrame().getLinks().setSelectTxt(Integer.toString(ScreenShotImage.totalSelected));
SplashScreen.getSingleton().getMainFrame().getLinks().addSelect(getLink().getLink());
}else {
ScreenShotImage.totalSelected--;
SplashScreen.getSingleton().getMainFrame().getLinks().setSelectTxt(Integer.toString(ScreenShotImage.totalSelected));
SplashScreen.getSingleton().getMainFrame().getLinks().removeSelect(getLink().getLink());
}
}
public void setupImageElements(){
painter = new Painter(){
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
BufferedImage img = getBufferedImage();
g.drawImage(img , 0, 0, null);
if(selected){
g2d.setColor(Color.RED);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 4 * 0.1f));
g2d.fillRect(0, 0, 161,106);
}
g2d.setColor(Color.black);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 6 * 0.1f));
g2d.fillRect(0,88, 90, 16);
g2d.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 12));
g2d.setColor(Color.white);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 8 * 0.1f));
g2d.drawString(getLink() != null ? getLink().getName().replaceAll(".png", "") : "No IMG" , 10, 101);
try {
g2d.drawImage(ImageIO.read(ScreenShotImage.class.getResource("/zoom.png")), 140,84,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
start = System.currentTimeMillis();
try{
// Delay depending on how far behind current time we are.
start += (1000/45);
Thread.sleep(Math.max(0, start - System.currentTimeMillis()));
} catch(Exception e){
e.printStackTrace();
}
}
};
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
painter.paint(g);
start = System.currentTimeMillis();
try{
// Delay depending on how far behind current time we are.
start += (1000/45);
Thread.sleep(Math.max(0, start - System.currentTimeMillis()));
} catch(Exception e){
e.printStackTrace();
}
}
public int getId() {
return id;
}
public void setID(int id){
this.id = id;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public ImageLink getLink() {
return link;
}
public void setLink(ImageLink link) {
this.link = link;
}
}
interface Painter {
public void paint(Graphics g);
}